// 这个类不会被实例化   不会被new
class Utils {

    // obj 这个 dom元素到body 的距离
    static offset(obj) {
        let o = { left: obj.offsetLeft, top: obj.offsetTop };
        while (obj.offsetParebt) { // 是否带有定位的父元素
            obj = obj.offsetParebt;
            o.left += obj.offsetLeft;
            o.top += obj.offsetTopS;
        }
        return o;
    }

    static getStyle(obj, attr) {
        if (obj.currentStyle) { // ie 6 7 8
            return obj.currentStyle[attr];
        }
        //google    null  或者 :before  :after
        return window.getComputedStyle(obj, null)[attr];
    }

    // 获取不可见区域的高度
    static getScroll() {
        // ie 9+
        if (window.pageYOffset != undefined) {
            return {
                left: window.pageXOffset,
                top: pageYOffset
            }
        } else if (document.compatMode === "CSS1Compat") {
            return { // DTD  带有标准文档声明
                left: document.documentElement.scrollLeft,
                top: document.documentElement.scrollTop
            }
        }
        return {
            left: document.body.scrollLeft,
            top: document.body.scrollTop
        }
    }

    // 缓冲动画
    static animate(oEle, json, callback) {
        // 清除上一个定时器
        clearInterval(oEle.timer);
        // 设置一个新的定时器
        oEle.timer = setInterval(() => {
            let flag = true; // 希望所有的动画完成
            for (let attr in json) {
                // 目标值
                let target = 0;
                // 当前位置
                let current = 0;
                if (Object.is(attr, "opacity")) { //放大 100 倍
                    target = parseFloat(json[attr]) * 100;
                    current = parseFloat(Utils.getStyle(oEle, attr)) * 100;
                } else {
                    target = parseInt(json[attr]);
                    current = parseInt(Utils.getStyle(oEle, attr));
                }
                // 步长 = (目标-当前)/10
                let steps = (target - current) / 10;
                steps = steps >= 0 ? Math.ceil(steps) : Math.floor(steps);
                // 新的位置 = 当前位置 + 步长  (zIndex, opacity, 不同的情况带单)
                if (attr === "opacity") {
                    // 源头放大100倍,就要缩小100倍
                    oEle.style[attr] = (current + steps) / 100;
                    // 兼容 ie
                    oEle.style.filter = "alpha(opacity=" + (current + steps) + ")";
                } else if (attr === "zIndex") {
                    // 直接到目标值, 不需要参与动画
                    // style是个对象, 可以[] 也可以.
                    oEle.style.zIndex = target;
                } else {
                    oEle.style[attr] = current + steps + "px";
                }

                if (target != current) {
                    flag = false;
                }


            }
            if (flag) {
                clearInterval(oEle.timer);
                if (typeof(callback) == "function") {
                    callback();
                }
            }
        }, 60)
    }
}